package com.leozhang.app;

import org.apache.commons.cli.*;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;

public class LeoUserUtil {

    private static String getJarName() {
        String jarPath = LeoUserUtil.class
                .getProtectionDomain()
                .getCodeSource()
                .getLocation()
                .getPath();

        // 取文件名
        return jarPath.substring(jarPath.lastIndexOf("/") + 1);
    }

    private static void generateAuthInfoForCR(String username, String password, String salt) {
        try {
            System.out.println("\n生成靶场平台用户名密码信息");
            // 用户输入原始密码，加密后传给后端
            String encryptedPassword = AESCryptoUtil.encrypt(password);
            System.out.println("调用后端认证接口传递的密码: " + encryptedPassword);

            // 后端解密
            String decryptedPassword = AESCryptoUtil.decrypt(encryptedPassword);
            // 后端使用随机的salt，将原始密码再次加密后存入数据库中
            String signContent = username.trim() + decryptedPassword.trim();
            String passwordInDB = UserUtils.sign(signContent, salt);
            System.out.println("用户存入数据库的信息, 用户名: " + username + ", 密码: " + passwordInDB + ", 随机盐: " + salt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void generateAuthInfoForPTMC(String username, String password, String salt) {
        System.out.println("\n生成渗透测试平台用户名密码信息");
        String encryptedPassword = SecureUtil.md5(password);
        System.out.println("调用后端认证接口传递的密码: " + encryptedPassword);

        // 后端使用随机的salt，将加密后存入数据库中
        String passwordInDB = UserUtils.sign(username.trim() + encryptedPassword.trim(), salt);
        System.out.println("用户存入数据库的信息, 用户名: " + username + ", 密码: " + passwordInDB + ", 随机盐: " + salt);
    }


    public static void main(String[] args) {
        // Generate a db salt and password for a specified username and userpass
        Options options = new Options();

        // -u 或 --username（必填）
        options.addOption(Option.builder("u")
                .longOpt("username")
                .hasArg()
                .argName("username")
                .desc("用户名（必填）")
                .required()
                .build());

        // -p 或 --password（必填）
        options.addOption(Option.builder("p")
                .longOpt("password")
                .hasArg()
                .argName("password")
                .desc("密码（必填）")
                .required()
                .build());

        // -s 或 --salt（可选）
        options.addOption(Option.builder("s")
                .longOpt("salt")
                .hasArg()
                .argName("salt")
                .desc("加密盐值（可选）")
                .required(false)
                .build());

        // -P 或 --platform（可选）
        options.addOption(Option.builder("P")
                .longOpt("platform")
                .hasArg()
                .argName("platform")
                .desc("平台信息（必填）, ptmc/cr")
                .required(true)
                .build());

        // 2. 解析命令行参数
        CommandLineParser parser = new DefaultParser();
        HelpFormatter formatter = new HelpFormatter(); // 用于帮助提示

        try {
            CommandLine cmd = parser.parse(options, args);

            // 获取参数值
            String username = cmd.getOptionValue("u");
            String password = cmd.getOptionValue("p");
            String salt = cmd.getOptionValue("s", null);  // 默认盐值
            String platform = cmd.getOptionValue("P", null);  // 默认盐值

            if (ObjectUtil.isNull(salt)) {
                salt = IdUtil.fastSimpleUUID();
            }

            // 3. 打印参数
            System.out.println("用户名: " + username);
            System.out.println("密码: " + password);
            System.out.println("盐值: " + salt);

            switch (platform) {
                case "ptmc":
                    generateAuthInfoForPTMC(username, password, salt);
                    break;
                case "cr":
                    generateAuthInfoForCR(username, password, salt);
                default:
                    break;
            }

        } catch (ParseException e) {
            System.err.println("参数错误: " + e.getMessage());
            String jarName = getJarName();
            formatter.printHelp("java -jar " + jarName, options, true);
            System.exit(1);
        }
    }
}
